from django.shortcuts import render
from rest_framework.response import Response
from rest_framework.views import APIView
from QQLoginTool.QQtool import OAuthQQ
from django.conf import settings

# from mall import settings

# Create your views here.
from oauth.models import OAuthQQUser
from oauth.utils import generic_access_token


def send_token(qquser):
    """代码重复使用，使用抽取"""
    from rest_framework_jwt.settings import api_settings
    jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
    jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER

    payload = jwt_payload_handler(qquser.user)
    token = jwt_encode_handler(payload)
    return token


"""
用户点击qq登陆的时候，应该发送一个ajax请求，来获取要跳转页面
这个　url 是根据腾讯文档生成的

请求方式　GET
请求路径　/oauth/qq/statues/
请求参数　无
返回响应　返回腾讯认证页面
"""


class OauthQQURLView(APIView):
    def get(self, request):
        #  登陆保存成功的返回地址
        state = '/'
        #  创建对象，传递参数
        #  client_id=None, client_secret=None, redirect_uri=None, state=None
        oauth = OAuthQQ(
            client_id=settings.QQ_CLIENT_ID,
            client_secret=settings.QQ_CLIENT_SECRET,
            redirect_uri=settings.QQ_REDIRECT_URI,
            state=state
        )
        #  调用方法，获取url
        login_url = oauth.get_qq_url()

        return Response({
            'login_url': login_url
        })


"""
授权登陆成功后　跳转到 http://www.meiduo.site:8080/oauth_callback.html?code=6E2E3F64C34ECFE29222EBC390D29196&state=test
前端应该把　code　传给后端
后端获取到code 去换取　token
根据token　就可以换取appid

请求方式　GET
请求路径　/oauth/qq/users/
请求参数　code
返回响应　查看用户是否已经绑定过，已经绑定跳转到首页　没有绑定跳转到绑定页面
"""
from rest_framework import status
from .serializers import OauthQQUserSerializer


class OauthQQUserView(APIView):
    def get(self, request):
        """
        获取前端传递过来的code 如果为空　返回400错误
        拿取code 换取token
        根据token　获取openid
        根据openid进行判断用户是否已经绑定，返回对应的页面
        """
        # 获取前端传递过来的code 如果为空　返回400错误
        code = request.query_params.get('code')
        if code is None:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        # 创建对象
        oauth = OAuthQQ(
            client_id=settings.QQ_CLIENT_ID,
            client_secret=settings.QQ_CLIENT_SECRET,
            redirect_uri=settings.QQ_REDIRECT_URI,
        )
        # 拿取code 换取token
        access_token = oauth.get_access_token(code)
        # 根据token　获取openid
        openid = oauth.get_open_id(access_token)
        # 根据openid进行判断用户是否已经绑定，返回对应的页面
        #  查询数据库　如果数据库中有openid 表示用户已经绑定了，返回首页
        #  查询数据库　如果数据库中没有openid 表示用户没有绑定了，返回绑定页面
        try:
            qquser = OAuthQQUser.objects.get(openid=openid)
        except OAuthQQUser.DoesNotExist:
            #  查询失败　说明没有绑定过，返回openid　
            #  openid是敏感信息，需要进行签名储存
            openid = generic_access_token(openid)
            return Response({'access_token': openid})
        else:
            #  查询成功，说明该用户已经绑定了
            #  说明该用户是登陆，既然是登陆　返回token
            # from rest_framework_jwt.settings import api_settings
            # jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
            # jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
            #
            # payload = jwt_payload_handler(qquser.user)
            # token = jwt_encode_handler(payload)
            token = send_token(qquser)

            return Response({
                'user_id': qquser.user.id,
                'username': qquser.user.username,
                'token': token
            })

    """
    当用户点击注册的时候，前端应该把　手机号　密码　短信验证码　openid 发送给后端

    后端接收参数
    校验参数
        校验　openid 和　短信验证码
        校验用户输入的手机号是否注册过
            如果注册过判断用户输入的密码是否正确
            如果没有注册过创建用户
    保存到数据库
    返回响应　返回用户id 用户名　和　token

    请求方式　POST
    请求路径　/oauth/qq/users/
    请求参数　mobile(手机号) password(密码) sms_code(短信验证码) access_token(openid)
    返回响应　返回用户id 用户名　和　token
    """

    def post(self, request):
        # 后端接收参数
        data = request.data
        # 校验参数
        #     校验　openid
        #     和　短信验证码
        #     校验用户输入的手机号是否注册过
        #     如果注册过判断用户输入的密码是否正确
        #     如果没有注册过创建用户
        serializer = OauthQQUserSerializer(data=data)
        serializer.is_valid(raise_exception=True)

        # 保存到数据库
        qquser = serializer.save()

        # 返回响应　返回用户id
        # 用户名　和　token
        token = send_token(qquser)

        return Response({
            'user_id': qquser.user.id,
            'username': qquser.user.username,
            'token': token
        })
